package cn.xhy.module.purchase.service.materialdemand;

import java.util.*;
import javax.validation.*;
import cn.xhy.module.purchase.controller.admin.materialdemand.vo.*;
import cn.xhy.module.purchase.dal.dataobject.materialdemand.MaterialDemandDO;
import cn.xhy.module.purchase.dal.dataobject.materialdemand.OfficeOrderDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.xhy.module.purchase.dal.dataobject.materialdemand.ProjectOrderDO;

/**
 * 单据 Service 接口
 *
 * @author xhy
 */
public interface MaterialDemandService {

    /**
     * 创建单据
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createMaterialDemand(@Valid MaterialDemandSaveReqVO createReqVO);

    /**
     * 更新单据
     *
     * @param updateReqVO 更新信息
     */
    void updateMaterialDemand(@Valid MaterialDemandSaveReqVO updateReqVO);

    /**
     * 删除单据
     *
     * @param id 编号
     */
    void deleteMaterialDemand(Long id);

    /**
     * 获得单据
     *
     * @param id 编号
     * @return 单据
     */
    MaterialDemandDO getMaterialDemand(Long id);

    /**
     * 获得单据分页
     *
     * @param pageReqVO 分页查询
     * @return 单据分页
     */
    PageResult<MaterialDemandDO> getMaterialDemandPage(MaterialDemandPageReqVO pageReqVO);

    // ==================== 子表（办公申请单） ====================

    /**
     * 获得办公申请单列表
     *
     * @param documentNumber 单据编号
     * @return 办公申请单列表
     */
    List<OfficeOrderDO> getOfficeOrderListByDocumentNumber(String documentNumber);

    // ==================== 子表（项目物资申请单） ====================

    /**
     * 获得项目物资申请单列表
     *
     * @param documentNumber 单据编号
     * @return 项目物资申请单列表
     */
    List<ProjectOrderDO> getProjectOrderListByDocumentNumber(String documentNumber);

    void updateByIdMaterialDemand(MaterialDemandSaveReqVO updateReqVO);

    void submitReceivable(Long id, Long loginUserId);

    void updateContractAuditStatus(Long id, Integer bpmResult);
}
